package main

import (
	"fmt"
	"time"
)

/**
1. 多个goroutine之间的通信是通过channel交互的
2. 信道的容量和长度：
	第一个参数指定信道的类型 chan int 表名channel只能接收和发送int类型
	第二个参数指定信道的容量，不填默认是0，指定信道的容量(可缓存多个数据)
3. 缓存信道与无缓存信道
	允许信道里存储一个或多个数据，这意味着，设置了缓冲区后，发送端和接收端可以处于异步的状态。
	pipline := make(chan int,10)
4.双向信道与单向信道
	通常情况我们定义的信道都是双向信道，可发送数据也可以接收数据
	有时，对信道的数据流向做一些控制，比如这个信道只能接收数据或者这个信道只能发送数据。
	因此就有了双向信道和单向信道两种类型

	单向信道：只读信道与只写信道

5.遍历信道
	// 遍历信道，可以使用 for 搭配 range关键字，在range时，要确保信道是处于关闭状态，否则循环会阻塞


*/
func main() {
	pipline := make(chan int)
	go onlyWriteChannel(pipline)
	go onlyReadChannel(pipline)
	time.Sleep(time.Second)
}

func onlyReadChannel(pipline chan int) {
	type Sender = <-chan int
	var sender Sender = pipline
	readValue := <-sender
	fmt.Println("定义只读信道，读取出来的值为: ", readValue)
}

func onlyWriteChannel(pipline chan int) {
	type Receiver = chan<- int
	var receiver Receiver = pipline
	writeValue := 999
	receiver <- writeValue
	fmt.Println("定义只写信道，传入数据的值为: ", writeValue)
}
